package com.dq.utils;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件读取
 * @author 凡
 */
public class FileReadUtils {
    private static Logger log = LoggerFactory.getLogger(FileReadUtils.class);

    /**
     * 文件是否存在
     * @param path 绝对路径
     */
    public static boolean fileExist(String path) {
        File file = new File(path);
        if(file.exists()){
            return true;
        }
        // 文件存在
        System.out.println(String.format("---->   文件不存在, path: %s", path));
        return false;
    }

    /**
     * 获取 springboot src / Resource 目录下, 文件的 IO流
     * 注意: 调用需判断 null
     * @@@@ [ 包括jar包中文件 ]
     * @param path : config.json
     */
    public static InputStream getResourceFileAndJar(String path) {
        InputStream in = FileReadUtils.class.getClassLoader().getResourceAsStream(path);
        // 根据是否读取到 IO流, 判断文件是否存在
        if(in == null) {
            System.out.println(String.format("---->   文件读取异常, path: %s", path));
        }

        return in;
    }
    /**
     * 获取 springboot Resource 目录下, 文件的全路径
     * 注意: 调用需判断 null
     * @@@@ [非jar] 文件 路径
     * @param path : config.json
     */
    public static String getResourcePathNoJar(String path) {
        URL resource = FileReadUtils.class.getClassLoader().getResource(path);
        // 根据是否读取到, 判断文件是否存在
        if(resource == null) {
            System.out.println(String.format("---->   文件读取异常, path: %s", path));
            return null;
        }
        // FileBasicsUtils.class.getClassLoader().getResource(path) 可能 为空
        return resource.getPath();
    }


    /* ---------------------------------------   读取文件 返回 内容   ------------------------------------------- **/
    /**
     * IO流 方式: [ 包括JAR包中 ]
     * 文件读取, 返回 list<每行数据> 适合获取文件内容, 对比获取配置文件
     * @param path :static/config.json
     */
    public static List<String> readLinesJarByIo(String path) {
        List<String> list = new ArrayList<>();

        InputStream in = null;
        BufferedReader bfReader = null;
        try {
            in = getResourceFileAndJar(path);
            if(in == null) {
                return list;
            }
            bfReader = new BufferedReader(new InputStreamReader(in));

            String line = "";
            while ((line = bfReader.readLine()) != null){
                list.add(line);
            }
        }catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }finally {
            // 关流
            closeReader(bfReader);
            closeInAndOut(in, null);
        }

        return list;
    }
    /**
     * IO流 方式: [ 包括JAR包中 ]
     * 文件读取, 返回 String 适合获取配置文件, 对比获取文件内容
     * @param path : static/config.json
     */
    public static String readStringJarByIo(String path) {
        StringBuilder builder = new StringBuilder();

        InputStream in = null;
        BufferedReader bfReader = null;
        try {
            in = getResourceFileAndJar(path);
            if(in == null) {
                return "";
            }
            bfReader = new BufferedReader(new InputStreamReader(in));

            String line = "";
            while ((line = bfReader.readLine()) != null){
                builder.append(line);
            }
        }catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }finally {
            // 关流
            closeReader(bfReader);
            closeInAndOut(in, null);
        }

        return builder.toString();
    }

    // ************************************************* 002: IO流 方式 end *********************************************************
    /**
     * 关闭 输出, 输入
     * @param in 输出
     * @param out 输入
     */
    public static void closeInAndOut(InputStream in, OutputStream out) {
        try {
            if(in != null) {
                in.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }
        try {
            if(out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }
    }
    /**
     * 关闭 Reader
     */
    public static void closeReader(Reader reader) {
        if(reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
    }

    public static void main(String[] args) {

    }

}
